﻿namespace BlogsAPI.Shorteners
{
    using System;
    using System.IO;
    using System.Net;
    using Abstract;
    using System.Web;

    /// <summary>
    /// Довольно часто, при общении в интернете люди пересылают друг другу ссылки. 
    /// Иногда эти ссылки бывают длинными. Совсем иногда — очень длинными. 
    /// Но почти всегда — слишком длинными. Для того чтобы избавиться от этой проблемы 
    /// был создан этот сайт. Да, я знаю что таких тысячи, но этот же лучше!
    /// </summary>
    /// <seealso cref="http://clck.ru/--"/>
    /// <remarks>
    /// There is only 1 function:
    /// http://clck.ru/--?url=http://b23.ru
    /// </remarks>
    [SingleShortener(Link = "http://clck.ru/")]
    public class Clck : Shortener
    {

        /// <summary>
        /// Преобразование одного типа данных в другой
        /// </summary>
        /// <param name="sInData">входные данные</param>
        /// <param name="sInType">входной тип</param>
        /// <param name="sOutType">выходной тип</param>
        /// <returns>Данные выходного типа</returns>
        /// <remarks>The fuction has bad code style</remarks>
        public override String ConvertDataTo(string sInData, ItemType sInType, ItemType sOutType)
        {
            if(sInType == ItemType.Clicks) return null;//cant be!
            if(sOutType == ItemType.User) return null;//cant be!
            if (sInType == sOutType) return sInData;

            //
            string url = null;
            if(sInType == ItemType.FullUrl)
            {
                url = String.Format("http://clck.ru/--?url={0}", HttpUtility.UrlEncode(sInData));
            }

            if (url == null) return null;

            HttpWebRequest request = MakeRequest(url); //prepare web request
            HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
            StreamReader responseStream = new StreamReader(resp.GetResponseStream()); //prepare responese holder
            String response = responseStream.ReadToEnd(); //fill up response
            responseStream.Close(); //Close stream
            if(resp.StatusCode == HttpStatusCode.OK)
            {
                return response;
            }
            return null;
        }
    }
}
